#include "spreadsheetview.h"

SpreadsheetView::SpreadsheetView(QWidget* parent)
    : QTableView(parent)// 继承 QTableView
{
    // 初始化视图样式
    initViewStyle();
    m_lastSelectedRow = -1; // 初始化为无效值
    m_lastSelectedCol = -1;
    setEditTriggers(QAbstractItemView::NoEditTriggers); // 禁用所有自动编辑触发
}
//析构函数
SpreadsheetView::~SpreadsheetView()
{

}

/*UI设计*/
//绘画函数
void SpreadsheetView::paintEvent(QPaintEvent *event)
{
    QTableView::paintEvent(event);// 调用基类实现完成默认绘制
}
// 初始化视图样式
void SpreadsheetView::initViewStyle()
{
    // 选择模式：连续选择（可拖动选择矩形区域）
    setSelectionMode(QAbstractItemView::ContiguousSelection);
    // 选择行为：按单元格选择（而非整行/整列）
    setSelectionBehavior(QAbstractItemView::SelectItems);
    // 显示网格线，样式为实线
    setShowGrid(true);
    setGridStyle(Qt::SolidLine);
    setStyleSheet("QTableView { gridline-color: #D9D9D9; }");

    // 垂直表头设置：可交互调整大小
    verticalHeader()->setSectionResizeMode(QHeaderView::Interactive);

    // 默认单元格尺寸：行高 20，列宽 64
    verticalHeader()->setDefaultSectionSize(20);
    horizontalHeader()->setDefaultSectionSize(64);

    // 水平表头样式：浅灰色背景 + 边框
    horizontalHeader()->setStyleSheet(
        "QHeaderView::section {"
        "  background-color: #F0F0F0;"
        "  border: 1px solid #D9D9D9;"
        "  padding: 4px;"
        "}"
        );

    // 滚动条策略：按需显示
    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);

    // 初始关闭交替行颜色（后续又被启用）
    setAlternatingRowColors(false);
    // 选中单元格样式：浅蓝色背景 + 黑色文字
    setStyleSheet(
        "QTableView {"
        "  selection-background-color: #D5E6FB;"
        "  selection-color: black;"
        "}"
        );

    // 启用 Tab 键导航
    setTabKeyNavigation(true);
    // 编辑触发方式：双击或按下编辑键（如 F2）
    setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed);

    verticalScrollBar()->installEventFilter(this); // 监听滚动条事件
}
//创建菜单项内容
void SpreadsheetView::contextMenuEvent(QContextMenuEvent *event)
{
    emit requestContextMenu(event->globalPos());
    event->accept();
}

/*鼠标事件*/
// 鼠标点击
void SpreadsheetView::mousePressEvent(QMouseEvent *event)
{
    // 仅处理选择逻辑，不调用基类的 mousePressEvent
    QTableView::mousePressEvent(event);// 基类处理选择逻辑

    // 获取点击位置的单元格索引
    QModelIndex index = indexAt(event->pos());
    if (index.isValid())
    {
        // setCurrentIndex(index); // 更新选中单元格
        int currentRow = index.row();
        int currentCol = index.column();
        if (currentRow > m_lastSelectedRow)
        {
            checkForRowExpansion(currentRow); // 检查是否需要扩展
        }
        if (currentCol > m_lastSelectedCol)
        {
            checkForColExpansion(currentCol);// 检查是否需要扩展
        }

        m_lastSelectedRow = currentRow; // 更新最后一次选中的行
        m_lastSelectedCol = currentCol; // 更新最后一次选中的行
    }
    event->accept(); // 阻止事件进一步传播
}
// 鼠标双击事件 编辑
void SpreadsheetView::mouseDoubleClickEvent(QMouseEvent *event)
{
    QModelIndex index = indexAt(event->pos());
    if (index.isValid()) {
        edit(index);// 进入编辑模式：此时会触发模型的data(index, Qt::EditRole)请求
    }
    // QTableView::mouseDoubleClickEvent(event); // 不需要 基类处理其他逻辑
}
// 鼠标按下事件
void SpreadsheetView::keyPressEvent(QKeyEvent *event)
{
    QModelIndex current = currentIndex();// 当前选中单元格
    int row = current.row();
    int col = current.column();
    switch (event->key()) {
    case  Qt::Key_Backspace:
    case Qt::Key_Delete:// 通常Delete键也有相同功能
        // 发送清除信号 槽函数交给主窗口类实现
        emit clearSelectedCells();
        event->accept();  // 标记事件已处理
        break;
    case Qt::Key_Up:// 上箭头：移动到上一行
        if (row > 0) setCurrentIndex(model()->index(row-1, col));
        break;
    case Qt::Key_Down:// 下箭头：移动到下一行
        if (row < model()->rowCount() - 1) {
            setCurrentIndex(model()->index(row + 1, col));
            checkForRowExpansion(row + 1); // 检查是否需要扩展
        }
        break;
    case Qt::Key_Left:// 左箭头：移动到左一列
        if (col > 0) setCurrentIndex(model()->index(row, col-1));
        break;
    case Qt::Key_Right:// 右箭头：移动到右一列
        if (col < model()->columnCount()-1)
        {
            setCurrentIndex(model()->index(row, col+1));
            checkForColExpansion(col + 1); // 检查是否需要扩展
        }
        break;
    case Qt::Key_F2:
    case Qt::Key_Enter://  F2 Enter/Return 键：编辑当前单元格
    case Qt::Key_Return:
        if (currentIndex().isValid()) {
            edit(currentIndex()); // 手动触发编辑
            event->accept();
            return;
        }
        break;
    default:
        QTableView::keyPressEvent(event);// 其他键交给基类处理
    }
    m_lastSelectedRow = current.row(); // 更新最后一次选中的行
    m_lastSelectedCol = current.column(); // 更新最后一次选中的列
}

/*检测是否自动行列扩展*/
//滚动条滚动函数 是否到达底部
void SpreadsheetView::scrollContentsBy(int dx, int dy)
{
    QTableView::scrollContentsBy(dx, dy);
    if (!m_isDraggingScrollBar &&
        verticalScrollBar()->value() == verticalScrollBar()->maximum()) {
        emit scrolledToBottom();
    }
}
//检查光标是否到达底部
void SpreadsheetView::checkForRowExpansion(int currentRow) {
    const int threshold = 1; // 距离底部多少行时触发扩展
    int totalRows = model()->rowCount();

    if (currentRow >= totalRows - threshold) {
        emit scrolledToBottom(); // 触发扩展信号
    }
}
//检查光标是否到达最右部
void SpreadsheetView::checkForColExpansion(int currentCol)
{
    const int threshold = 1;
    int totalCols = model()->columnCount();// columnCount() 返回的是 [0, totalCols-1]）。

    if(currentCol >=totalCols-threshold){
        emit scrolledToRight(); // 触发扩展信号
    }
}
//事件过滤器
bool SpreadsheetView::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == verticalScrollBar()) {
        switch (event->type()) {
        case QEvent::MouseButtonPress://按住滚动条时 设置标记字
            if (static_cast<QMouseEvent*>(event)->button() == Qt::LeftButton) {
                m_isDraggingScrollBar = true;
            }
            break;
        case QEvent::MouseButtonRelease:
            m_isDraggingScrollBar = false;
            break;
        default:
            break;
        }
    }
    return QTableView::eventFilter(watched, event);
}




